package com.gourd.common.utils;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.*;

/**
 * 文档转为swf工具类
 * 不支持中文路径  swf文件名不能为中文名
 *
 * @author gourd
 */
@Slf4j
@Component
public class DocConverter {

    @Value("${openOffice.ip}")
    private String host;
    @Value("${openOffice.port}")
    private int port;
    /**
     * 环境1：windows,2:linux(涉及pdf2swf路径问题)
     */
    private static final int environment = 1;
    private String fileString;
    /**
     * 输入路径，如果不设置就输出在默认位置（可不修改）
     */
    private String outputPath = "";
    private String fileName;
    private File pdfFile;
    private File swfFile;
    private File docFile;
    /**
     * pdf2swf.exe文件的位置
     */
    private String pdf2swfexePath = "";

    public DocConverter(String fileString, String outputPath, String pdf2swfexePath) {
        this.outputPath = outputPath;
        this.pdf2swfexePath = pdf2swfexePath;
        ini(fileString, outputPath);
    }

    public DocConverter(String fileString) {

        ini(fileString);
    }
    public DocConverter() {
    }
    /**
     * 重新设置 file @param fileString
     */
    public void setFile(String fileString) {
        ini(fileString);
    }

    /**
     * 初始化 文件输出到默认位置 lwh 2018年9月27日 上午10:27:36
     * 
     * @param fileString
     */
    private void ini(String fileString) {
        this.fileString = fileString;
        fileName = fileString.substring(0, fileString.lastIndexOf(".")).trim();
        docFile = new File(fileString);
        String fn = String.valueOf(System.currentTimeMillis());
        pdfFile = new File(fn.trim() + ".pdf");
        swfFile = new File(fn.trim() + ".swf");
    }

    /**
     * 文件输出到指定位置 lwh 2018年9月27日 上午10:27:14
     * 
     * @param fileString  待转换文件全路径
     * @param optPath  文件输出位置
     */
    private void ini(String fileString, String optPath) {

        this.fileString = fileString;
        String fn = String.valueOf(System.currentTimeMillis());
        docFile = new File(fileString);
        pdfFile = new File(optPath, fn + ".pdf");
        swfFile = new File(optPath, fn + ".swf");
    }

    /**
     * 文档转为pdf lwh 2018年9月27日 上午10:28:21
     * 
     * @throws Exception
     */
    private void doc2pdf() throws Exception {
        if (docFile.exists()) {
            if (!pdfFile.exists()) {
                OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1",8100);
                try {
                    connection.connect();
                    DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
                    converter.convert(docFile, pdfFile);
                    connection.disconnect();
                    log.info("****pdf转换成功，PDF输出：" + pdfFile.getPath() + "****");

                } catch (java.net.ConnectException e) {
                    e.printStackTrace();
                    throw new Exception("****swf转换异常，openoffice服务未启动！****");
                } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
                    e.printStackTrace();
                    throw new Exception("****swf转换器异常，读取转换文件失败****");
                } catch (Exception e) {
                    e.printStackTrace();
                    throw e;
                }
            } else {
                throw new Exception("****已经转换为pdf，不需要再进行转化****");
            }
        } else {
            throw new Exception("****swf转换器异常，需要转换的文档不存在，无法转换****");
        }
    }

    /**
     * pdf转为swf文件
     * lwh
     * 2018年9月27日 上午10:28:31
     * @throws Exception
     */
    @SuppressWarnings("unused")
    private void pdf2swf() throws Exception {
        Runtime r = Runtime.getRuntime();
        if (!swfFile.exists()) {
            if (pdfFile.exists()) {
                if (1 == environment)// windows环境处理
                {
                    try {
                        // 这里根据SWFTools安装路径需要进行相应更改 修改2
                        Process p = r.exec(pdf2swfexePath + "/pdf2swf.exe " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9");
                        log.info(loadStream(p.getInputStream()));
                        log.info(loadStream(p.getErrorStream()));
                        log.info(loadStream(p.getInputStream()));
                        log.info("****swf转换成功，文件输出：" + swfFile.getPath() + "****");
                        if (pdfFile.exists()) {
                            pdfFile.delete();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                } else if (environment == 2)// linux环境处理
                {
                    try {
                        Process p = r.exec("pdf2swf " + pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9");
                        log.info(loadStream(p.getInputStream()));
                        log.info(loadStream(p.getErrorStream()));
                        log.info("****swf转换成功，文件输出：" + swfFile.getPath() + "****");
                        if (pdfFile.exists()) {
                            pdfFile.delete();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                }
            } else {
                throw new Exception("****pdf不存在，无法转换****");
            }
        } else {
            throw new Exception("****swf已存在不需要转换****");
        }
    }

    static String loadStream(InputStream in) throws IOException {
        int ptr = 0;
        // 把InputStream字节流 替换为BufferedReader字符流
        BufferedReader reader = new BufferedReader(new InputStreamReader(in, "GB2312"));
        StringBuilder buffer = new StringBuilder();
        while ((ptr = reader.read()) != -1) {
            buffer.append((char) ptr);
        }
        return buffer.toString();
    }

    /**
     * 转换主方法
     * lwh
     * 2018年9月27日 上午10:28:47
     * @return
     * @throws Exception 
     */

    @SuppressWarnings("unused")
    public boolean conver() throws Exception {
        boolean  flag = false;
        if (swfFile.exists()) {
            log.info("****swf转换器开始工作，该文件已经转换为swf****");
            flag =  true;
        }
        if (environment == 1) {
            log.info("****swf转换器开始工作，当前设置运行环境windows****");
        } else {
            log.info("****swf转换器开始工作，当前设置运行环境linux****");
        }
        try {
            doc2pdf();
            pdf2swf();
        } catch (Exception e) { // TODO: Auto-generated catch block
            e.printStackTrace();
            
            flag =  false;
            throw new Exception(e.getMessage());
        }
        if (swfFile.exists()) {
            flag =  true;
        } else {
            flag =  false;
        }
        return  flag;
    }

    /**
     * 返回转换 后的swf文件的路径
     * lwh
     * 2018年9月27日 上午10:29:05
     * @return
     */
    public String getswfPath() {
        if (swfFile.exists()) {
            String tempString = swfFile.getPath();
            tempString = tempString.replaceAll("\\\\", "/");
            return tempString;
        } else {
            return "";
        }

    }

    /*
     * 设置输出路径
     */public void setOutputPath(String outputPath) {
        this.outputPath = outputPath;
        if (!outputPath.equals("")) {
            String realName = fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf("."));
            if (outputPath.charAt(outputPath.length()) == '/') {
                swfFile = new File(outputPath + realName + ".swf");
            } else {
                swfFile = new File(outputPath + realName + ".swf");
            }
        }
    }

    public static void main(String[] args) {
//         修改1-不支持中文路径和中文文档
         DocConverter d = new DocConverter("C:\\Users\\Administrator\\Desktop\\4月22日勤务管理169环境验收问题.docx");
        try {
            d.conver();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}